﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CcrSpaces.Core;
using kk.components.contracts;
using kk.components.contracts.ServiceContract;
using kk.messages.contracts.DataModel;
using kk.messages.contracts.ViewModel;
using Microsoft.Ccr.Core;

namespace kk.kinokasseserviceproxy
{
    public class KinokasseServiceProxyInSpace : IKinokasseServiceProxy
    {
        private ICcrSpace space;
        private PKinokasseServiceStub service;


        public void Configure(string configString, string serverAddress)
        {
            space = new CcrSpace().ConfigureAsHost(configString);
            service = space.ConnectToAsyncComponent<PKinokasseServiceStub>(serverAddress + "/" + PKinokasseServiceStub.SERVICE_NAME);
        }

        public void Dispose()
        {
            if (space != null) space.Dispose();
        }


        public void ProcessBelegungsplanZuVorstellung(Request<Vorstellung, Belegungsplan> request)
        {
            service.Post(new PKinokasseServiceStub.Belegungsplananforderung
                             {
                                 Vorstellung = request.RequestData,
                                 ResponsePin = space.CreateChannel<Belegungsplan>(belegungsplan => request.ResponsePin(belegungsplan), CcrsHandlerModes.InCurrentSyncContext)
                             });
        }


        public void ProcessReservierungsanfrage(Request<Reservierungsanfrage, Reservierungsbestätigung> request)
        {
            service.Post(new PKinokasseServiceStub.ReservierungenVornehmen
                             {
                                 Reservierungsanfrage = request.RequestData,
                                 ResponsePin = space.CreateChannel<Reservierungsbestätigung>(bestätigung => request.ResponsePin(bestätigung), CcrsHandlerModes.InCurrentSyncContext)
                             });
        }
    }
}
